package be.xios.projectquiz.game;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JRadioButton;
import javax.swing.border.TitledBorder;

import be.xios.projectquiz.engine.EngineDB;
import net.miginfocom.swing.MigLayout;

/// <summary>
/// Deze klasse is een antwoordpanel waarop de antwoorden van de spelers verbetert kunnen worden
/// </summary>
/// <author>Flemming Bosch & Sebastian Kubski</author>
@SuppressWarnings("serial")
public class AntwoordPanel extends JPanel {
	
	//Layout
	private JPanel frameCenter;
		private JPanel frameCenterLeft;
			private JPanel frameCenterLeftTop;
				private JPanel frameCenterLeftTopTop;
					private JLabel vraag;
					private JLabel antwoord;
					private JLabel vraagTxt;
					private JLabel antwTxt;
			private JPanel frameCenterCenter;
				private JPanel frameCenterLeftLeft;
					private JLabel[] spelernamen;
					private JLabel[] antwoordSpelers;
				private JPanel frameCenterLeftCenter;
		private JPanel frameCenterRight;
			private JPanel frameCenterRightTop;
				private JLabel juist;
				private JLabel fout;
			private JPanel frameCenterRightCenter;
				private ButtonGroup[] buttonGroup;
				private JRadioButton[] radioButtons;		
	//
	private TitledBorder gegevensdb,spelers,controle,controle2;
	private JProgressBar progressBar;
	private boolean radioBooleans[];
	
	private int aantalSpelers;
	private EngineDB edb;
	
	public AntwoordPanel(Game game) {
		this.aantalSpelers = game.getSpelers();
		this.setLayout(new BorderLayout());
		
		//FRAME CENTER
		frameCenter = new JPanel(new BorderLayout());
			//FRAME CENTER LINKS
			frameCenterLeft = new JPanel(new BorderLayout());
				//FRAME CENTER LINKS NORTH
				frameCenterLeftTop = new JPanel(new BorderLayout());
					frameCenterLeftTopTop = new JPanel(new MigLayout());
						vraag = new JLabel("Vraag :");
						antwoord = new JLabel("Antwoord : ");
						vraagTxt = new JLabel("hier komt vraagske");
						antwTxt = new JLabel("hier komt antwoordje");
					
						frameCenterLeftTopTop.add(vraag);
						frameCenterLeftTopTop.add(vraagTxt,"wrap");
						frameCenterLeftTopTop.add(antwoord);
						frameCenterLeftTopTop.add(antwTxt,"wrap");
						
				gegevensdb =BorderFactory.createTitledBorder("Database gegevens");
		//		gegevensdb.setTitleFont(new Font("Euphemia", Font.BOLD, 50));
				gegevensdb.setTitleJustification(TitledBorder.LEFT);
				frameCenterLeftTop.setBorder(gegevensdb);
				frameCenterLeftTop.add(frameCenterLeftTopTop);
				
				frameCenterCenter = new JPanel(new BorderLayout(50,50));
					//FRAME CENTER LINKS WEST
					frameCenterLeftLeft = new JPanel(new GridLayout(aantalSpelers,1));
						spelernamen = new JLabel[aantalSpelers];
						initialiseerLabels();
						
						for (int i = 0; i < spelernamen.length; i++) {
							frameCenterLeftLeft.add(spelernamen[i]);
						}
						
					//FRAME CENTER LINKS CENTER
					frameCenterLeftCenter = new JPanel(new GridLayout(aantalSpelers,1));
						antwoordSpelers = new JLabel[aantalSpelers];
						initialiseerAntwoorden();
						
						for (int i = 0; i < antwoordSpelers.length; i++) {
							frameCenterLeftCenter.add(antwoordSpelers[i]);
						}
						
					spelers =BorderFactory.createTitledBorder("Antwoorden van spelers");
//					spelers.setTitleFont(new Font("Euphemia", Font.BOLD, 50));
					spelers.setTitleJustification(TitledBorder.LEFT);
					frameCenterCenter.setBorder(spelers);
				frameCenterCenter.add(frameCenterLeftLeft,BorderLayout.WEST);
				frameCenterCenter.add(frameCenterLeftCenter,BorderLayout.CENTER);
				
			frameCenterLeft.add(frameCenterLeftTop,BorderLayout.NORTH);	
			frameCenterLeft.add(frameCenterCenter,BorderLayout.CENTER);
			
			//FRAME CENTER RECHTS
			frameCenterRight = new JPanel(new BorderLayout());
				frameCenterRightTop = new JPanel(new MigLayout());
					juist = new JLabel("Juist", JLabel.HORIZONTAL);
		//			juist.setFont(new Font("Euphemia", Font.BOLD, 30));
					fout  = new JLabel("Fout ", JLabel.HORIZONTAL);
		//			fout.setFont(new Font("Euphemia", Font.BOLD, 30));
					JLabel geest[] = new JLabel[4];
					
					for (int i = 0; i < geest.length; i++) {
						geest[i] = new JLabel("         ");
					}
					
				frameCenterRightTop.add(juist);
				frameCenterRightTop.add(geest[0]);
				frameCenterRightTop.add(fout,"wrap");
				frameCenterRightTop.add(geest[1]);
				frameCenterRightTop.add(geest[2]);
				frameCenterRightTop.add(geest[3],"wrap");
	
				//Border aanmaken
				controle =BorderFactory.createTitledBorder("Juist/Fout");
		//		controle.setTitleFont(new Font("Euphemia", Font.BOLD, 50));
				controle.setTitleJustification(TitledBorder.LEFT);
				frameCenterRightTop.setBorder(controle);
				
				frameCenterRightCenter = new JPanel(new GridLayout(aantalSpelers,1,35,0));
					//ButtonGroups aanmaken 
					buttonGroup = new ButtonGroup[aantalSpelers];
					//Radiobuttons aanmaken ( voor elke group 2x)
					radioButtons = new JRadioButton[(aantalSpelers*2)];
					radioBooleans = new boolean[aantalSpelers*2];
					
					initialiseerButtons();

					for (int i = 0; i < buttonGroup.length; i++) {
						buttonGroup[i].add(radioButtons[(i*2)]);
						buttonGroup[i].add(radioButtons[(i*2)+1]);
							
						frameCenterRightCenter.add(radioButtons[(i*2)]);
						frameCenterRightCenter.add(radioButtons[(i*2)+1]);		
					}

					//Border aanmaken
					controle2 =BorderFactory.createTitledBorder("Aanduiden");
			//		controle2.setTitleFont(new Font("Euphemia", Font.BOLD, 50));
					controle2.setTitleJustification(TitledBorder.LEFT);
					frameCenterRightCenter.setBorder(controle2);
					
			frameCenterRight.add(frameCenterRightTop,BorderLayout.NORTH);
			frameCenterRight.add(frameCenterRightCenter,BorderLayout.CENTER);
			
		progressBar = new JProgressBar(0, aantalSpelers);
		progressBar.setSize(1920, 250);
		progressBar.setValue(0);
		progressBar.setStringPainted(true);	
	
		frameCenter.add(frameCenterLeft,BorderLayout.CENTER);
		frameCenter.add(frameCenterRight,BorderLayout.EAST);
		frameCenter.add(progressBar , BorderLayout.SOUTH);
		
		add(frameCenter,BorderLayout.CENTER);	
	}
	
	/// <summary>
	/// Deze method initialiseert de buttongroups, radiobuttons en overeenkomende radioboolean(progressbar) in 1 klap en hangt er de handlers aan
	/// </summary>
	/// <author>Flemming Bosch & Sebastian Kubski</author>
	private void initialiseerButtons() {
		ItemHandler iHandler = new ItemHandler();
		//ButtonGroups initialiseren
		for (int i = 0; i < buttonGroup.length; i++) {
			buttonGroup[i] = new ButtonGroup();
		}	
		//RadionButtons initialiseren
		for (int i = 0; i < radioButtons.length; i++) {
			radioBooleans[i] = false;
			radioButtons[i] = new JRadioButton();	
			radioButtons[i].addItemListener(iHandler);
		}
	}
	
	/// <summary>
	/// Deze method berekent de progress die displayed moet worden op de progressbar
	/// </summary>
	/// <author>Sebastian Kubski</author>
	private class ItemHandler implements ItemListener {
		@Override
		public void itemStateChanged(ItemEvent e) {
			for (int i = 0; i < radioButtons.length; i++) {
				if(radioButtons[i].isSelected() && !radioBooleans[i]) {
					int evenOven = i % 2;

					if( evenOven  == 0 && !radioBooleans[i+1 ]) {
						progressBar.setValue(progressBar.getValue() + 1);
					} else
					if (evenOven == 1  && !radioBooleans[i-1] ) {
						progressBar.setValue(progressBar.getValue() + 1);
					}
					radioBooleans[i] = true;				
				}
			}			
		}
	}
	/// <summary>
	/// Deze method initialiseert de nodige labels voor de spelers namen
	/// </summary>
	/// <author>Flemming Bosch</author>
	private void initialiseerLabels() {
		//Spelernaam Labels initaliseren
		for (int i = 0; i < spelernamen.length; i++) {
			spelernamen[i] = new JLabel("");
		}
	}
	
	/// <summary>
	/// Deze method initialiseert de nodige labels  voor antwoorden
	/// </summary>
	/// <author>Flemming Bosch</author>
	private void initialiseerAntwoorden(){
		//antwoorden labels van de spelers initialiseren
		for (int i = 0; i < antwoordSpelers.length; i++) {
			antwoordSpelers[i] = new JLabel("");
		}
	}
	
	/// <summary>
	/// Deze method zorgt ervoor dat de nieuwe antwoorden worden weergegeven op deze frame
	/// </summary>
	/// <author>Sebastian Kubski</author>		
	public void updateAntwoordPanel(Game currentGame) {	
		//De huidide vraag en antwoord displayen
		vraagTxt.setText(currentGame.getVolgendeVraag().getVraag());
		antwTxt.setText(currentGame.getVolgendeVraag().getAntwoord());
		//Spelers + antwoorden weergeven
		for (int i = 0; i < spelernamen.length; i++) {
			spelernamen[i].setText(currentGame.getAntwoordList().get(i).getName());
			antwoordSpelers[i].setText(currentGame.getAntwoordList().get(i).getAntwoord());
		}
	}
	
	/// <summary>
	/// Deze method berekent welke player welke score krijgt adhv de geselecteerde radiobutton
	/// </summary>
	/// <author>Sebastian Kubski</author>
	public void berekenScores(Game currentGame) {

		for(int i = 0; i < radioButtons.length; i=i+2) {
			
			if(radioButtons[i].isSelected()) {			
	
				for(Player p: currentGame.getPlayerList()) {
					if(spelernamen[i/2].getText().equals(p.getNaam())) {
						p.setScore(p.getScore() + 10);
					}
				}
			}
		}		
		//buttongroups clearen
		for (int i = 0; i < buttonGroup.length; i++) {
			buttonGroup[i].clearSelection();
		}
		//radiobooleans resetten
		for (int i = 0; i < radioBooleans.length; i++) {
			radioBooleans[i]=false;
		}
		//progressbar resetten
		progressBar.setValue(0);
		
		//Controle op de laatste vraag en laatste beantwoording
		if( currentGame.getHuidigeVraag() == ( (currentGame.getVragenPerRonde() * currentGame.getRondes() ) - 1 )) {
			currentGame.setEnded(true);
		} 	
	} // einde berekenscores
	
	public boolean selectButton(Game game) {
		int count = 0;
		for (int i = 0; i < radioButtons.length; i++) {
			if (radioButtons[i].isSelected()) {
				count++;
			}
		}
		if (count==game.getSpelers()){
			return true;
		} else {
			return false;
		}
	}


	/// <summary>
	/// Deze method berekent de winnaar
	/// </summary>
	/// <author>Sonny Valkeneers</author>
	public void berekenWinnaar(Game updatedGame) {
		int firstScore = 0;
		Player winnaar = null;
		Player winnaar2 = null;
		edb=new EngineDB();
		boolean draw = false;
		for (int i = 0; i < updatedGame.getPlayerList().size(); i++) {
			if (firstScore < updatedGame.getPlayerList().get(i).getScore()) {
				firstScore=updatedGame.getPlayerList().get(i).getScore();
				winnaar = updatedGame.getPlayerList().get(i);
				draw = false;
			} else
			if(firstScore==updatedGame.getPlayerList().get(i).getScore()) {
				winnaar2 = updatedGame.getPlayerList().get(i);
				draw = true;
			}
		}
		
		if (draw) {
			JOptionPane.showMessageDialog(null, winnaar.getNaam() + " & " + winnaar2.getNaam() + " behaalden een even hoge score");
			
		} else {
			JOptionPane.showMessageDialog(null, winnaar.getNaam() + " is de winnaar");
			//edb.InsertPlayerScore( winnaar.getVoornaam(), winnaar.getNaam(), winnaar.getScore());
		}
	}	
} // Einde AntwoordPanel